/***************************************************************************/
/*                                                                         */
/*  t1types.h                                                              */
/*                                                                         */
/*    Basic Type1/Type2 type definitions and interface (specification      */
/*    only).                                                               */
/*                                                                         */
/*  Copyright 1996-2004, 2006, 2008, 2009, 2011 by                         */
/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
/*                                                                         */
/*  This file is part of the FreeType project, and may only be used,       */
/*  modified, and distributed under the terms of the FreeType project      */
/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
/*  this file you indicate that you have read the license and              */
/*  understand and accept it fully.                                        */
/*                                                                         */
/***************************************************************************/


#ifndef __T1TYPES_H__
#define __T1TYPES_H__


#include <ft2build.h>
#include FT_TYPE1_TABLES_H
#include FT_INTERNAL_POSTSCRIPT_HINTS_H
#include FT_INTERNAL_SERVICE_H
#include FT_SERVICE_POSTSCRIPT_CMAPS_H


FT_BEGIN_HEADER


/*************************************************************************/
/*************************************************************************/
/*************************************************************************/
/***                                                                   ***/
/***                                                                   ***/
/***              REQUIRED TYPE1/TYPE2 TABLES DEFINITIONS              ***/
/***                                                                   ***/
/***                                                                   ***/
/*************************************************************************/
/*************************************************************************/
/*************************************************************************/


/*************************************************************************/
/*                                                                       */
/* <Struct>                                                              */
/*    T1_EncodingRec                                                     */
/*                                                                       */
/* <Description>                                                         */
/*    A structure modeling a custom encoding.                            */
/*                                                                       */
/* <Fields>                                                              */
/*    num_chars  :: The number of character codes in the encoding.       */
/*                  Usually 256.                                         */
/*                                                                       */
/*    code_first :: The lowest valid character code in the encoding.     */
/*                                                                       */
/*    code_last  :: The highest valid character code in the encoding     */
/*                  + 1. When equal to code_first there are no valid     */
/*                  character codes.                                     */
/*                                                                       */
/*    char_index :: An array of corresponding glyph indices.             */
/*                                                                       */
/*    char_name  :: An array of corresponding glyph names.               */
/*                                                                       */
typedef struct T1_EncodingRecRec_
{
    FT_Int num_chars;
    FT_Int code_first;
    FT_Int code_last;

    FT_UShort *char_index;
    FT_String **char_name;

} T1_EncodingRec, *T1_Encoding;


/* used to hold extra data of PS_FontInfoRec that
 * cannot be stored in the publicly defined structure.
 *
 * Note these can't be blended with multiple-masters.
 */
typedef struct PS_FontExtraRec_
{
    FT_UShort fs_type;

} PS_FontExtraRec;


typedef struct T1_FontRec_
{
    PS_FontInfoRec font_info;         /* font info dictionary   */
    PS_FontExtraRec font_extra;        /* font info extra fields */
    PS_PrivateRec private_dict;      /* private dictionary     */
    FT_String *font_name;         /* top-level dictionary   */

    T1_EncodingType encoding_type;
    T1_EncodingRec encoding;

    FT_Byte *subrs_block;
    FT_Byte *charstrings_block;
    FT_Byte *glyph_names_block;

    FT_Int num_subrs;
    FT_Byte **subrs;
    FT_PtrDist *subrs_len;

    FT_Int num_glyphs;
    FT_String **glyph_names;       /* array of glyph names       */
    FT_Byte **charstrings;       /* array of glyph charstrings */
    FT_PtrDist *charstrings_len;

    FT_Byte paint_type;
    FT_Byte font_type;
    FT_Matrix font_matrix;
    FT_Vector font_offset;
    FT_BBox font_bbox;
    FT_Long font_id;

    FT_Fixed stroke_width;

} T1_FontRec, *T1_Font;


typedef struct CID_SubrsRec_
{
    FT_UInt num_subrs;
    FT_Byte **code;

} CID_SubrsRec, *CID_Subrs;


/*************************************************************************/
/*************************************************************************/
/*************************************************************************/
/***                                                                   ***/
/***                                                                   ***/
/***                AFM FONT INFORMATION STRUCTURES                    ***/
/***                                                                   ***/
/***                                                                   ***/
/*************************************************************************/
/*************************************************************************/
/*************************************************************************/

typedef struct AFM_TrackKernRec_
{
    FT_Int degree;
    FT_Fixed min_ptsize;
    FT_Fixed min_kern;
    FT_Fixed max_ptsize;
    FT_Fixed max_kern;

} AFM_TrackKernRec, *AFM_TrackKern;

typedef struct AFM_KernPairRec_
{
    FT_Int index1;
    FT_Int index2;
    FT_Int x;
    FT_Int y;

} AFM_KernPairRec, *AFM_KernPair;

typedef struct AFM_FontInfoRec_
{
    FT_Bool IsCIDFont;
    FT_BBox FontBBox;
    FT_Fixed Ascender;
    FT_Fixed Descender;
    AFM_TrackKern TrackKerns;   /* free if non-NULL */
    FT_Int NumTrackKern;
    AFM_KernPair KernPairs;    /* free if non-NULL */
    FT_Int NumKernPair;

} AFM_FontInfoRec, *AFM_FontInfo;


/*************************************************************************/
/*************************************************************************/
/*************************************************************************/
/***                                                                   ***/
/***                                                                   ***/
/***                ORIGINAL T1_FACE CLASS DEFINITION                  ***/
/***                                                                   ***/
/***                                                                   ***/
/*************************************************************************/
/*************************************************************************/
/*************************************************************************/


typedef struct T1_FaceRec_ *T1_Face;

typedef struct CID_FaceRec_ *CID_Face;


typedef struct T1_FaceRec_
{
    FT_FaceRec root;
    T1_FontRec type1;
    const void *psnames;
    const void *psaux;
    const void *afm_data;
    FT_CharMapRec charmaprecs[2];
    FT_CharMap charmaps[2];

#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
    PS_Unicodes     unicode_map;
#endif

    /* support for Multiple Masters fonts */
    PS_Blend blend;

    /* undocumented, optional: indices of subroutines that express      */
    /* the NormalizeDesignVector and the ConvertDesignVector procedure, */
    /* respectively, as Type 2 charstrings; -1 if keywords not present  */
    FT_Int ndv_idx;
    FT_Int cdv_idx;

    /* undocumented, optional: has the same meaning as len_buildchar */
    /* for Type 2 fonts; manipulated by othersubrs 19, 24, and 25    */
    FT_UInt len_buildchar;
    FT_Long *buildchar;

    /* since version 2.1 - interface to PostScript hinter */
    const void *pshinter;

} T1_FaceRec;


typedef struct CID_FaceRec_
{
    FT_FaceRec root;
    void *psnames;
    void *psaux;
    CID_FaceInfoRec cid;
    PS_FontExtraRec font_extra;
#if 0
    void*            afm_data;
#endif
    CID_Subrs subrs;

    /* since version 2.1 - interface to PostScript hinter */
    void *pshinter;

    /* since version 2.1.8, but was originally positioned after `afm_data' */
    FT_Byte *binary_data; /* used if hex data has been converted */
    FT_Stream cid_stream;

} CID_FaceRec;


FT_END_HEADER

#endif /* __T1TYPES_H__ */


/* END */
